#include<iostream>

template<typename T0>
void printf1(T0 value) {
    std::cout<< "only one apram, value:";
    std::cout<< value << std::endl;
}

template<typename T, typename... Ts>
void printf1(T value, Ts... args) {
    std::cout<< "many aprams, values:";
    std::cout<< value << std::endl;
    printf1(args...);
}

int main() {
    printf1(1, 2, "123", 1.1);
    return 0;
}
/**
 * 
output:
many aprams, values:1
many aprams, values:2
many aprams, values:123
only one apram, value:1.1 

//function calls
printf1(1, 2, "123", 1.1); //printf1(T value, Ts... args)
printf1(2, "123", 1.1);    //printf1(T value, Ts... args)
printf1("123", 1.1);       //printf1(T value, Ts... args)
printf1(1.1);              //printf1(T0 value)
 */